{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Variable Conventions\n",
    "<code>\n",
    "df_final = final dataframe\n",
    "df = original dataframe\n",
    "df_five = 5 variables # Use as default unless Peter's analysis suggest otherwise\n",
    "df_seven = 7 variables\n",
    "<code>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lab 2: Network Intrusion Detection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda\\envs\\ipykernel_py2\\lib\\site-packages\\sklearn\\cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n",
      "C:\\Anaconda\\envs\\ipykernel_py2\\lib\\site-packages\\sklearn\\lda.py:4: DeprecationWarning: lda.LDA has been moved to discriminant_analysis.LinearDiscriminantAnalysis in 0.17 and will be removed in 0.19\n",
      "  \"in 0.17 and will be removed in 0.19\", DeprecationWarning)\n",
      "C:\\Anaconda\\envs\\ipykernel_py2\\lib\\site-packages\\IPython\\html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n",
      "  \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n"
     ]
    }
   ],
   "source": [
    "# Imports\n",
    "from matplotlib import pyplot as plt\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "from sklearn.cross_validation import ShuffleSplit\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn import metrics as mt\n",
    "from sklearn.svm import SVC\n",
    "\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.cross_validation import StratifiedKFold\n",
    "\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "\n",
    "from sklearn.decomposition import RandomizedPCA \n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.lda import LDA\n",
    "\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn import metrics as mt\n",
    "\n",
    "import seaborn as sns\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 82328 entries, 0 to 82331\n",
      "Data columns (total 6 columns):\n",
      "sttl                82328 non-null int64\n",
      "ct_dst_sport_ltm    82328 non-null int64\n",
      "ct_src_dport_ltm    82328 non-null int64\n",
      "swin                82328 non-null int64\n",
      "dwin                82328 non-null int64\n",
      "label               82328 non-null int64\n",
      "dtypes: int64(6)\n",
      "memory usage: 4.4 MB\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sttl</th>\n",
       "      <th>ct_dst_sport_ltm</th>\n",
       "      <th>ct_src_dport_ltm</th>\n",
       "      <th>swin</th>\n",
       "      <th>dwin</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>82328.000000</td>\n",
       "      <td>82328.000000</td>\n",
       "      <td>82328.000000</td>\n",
       "      <td>82328.000000</td>\n",
       "      <td>82328.000000</td>\n",
       "      <td>82328.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>180.973448</td>\n",
       "      <td>3.663092</td>\n",
       "      <td>4.929040</td>\n",
       "      <td>133.453175</td>\n",
       "      <td>128.280464</td>\n",
       "      <td>0.550578</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>101.512436</td>\n",
       "      <td>5.915518</td>\n",
       "      <td>8.389724</td>\n",
       "      <td>127.357276</td>\n",
       "      <td>127.491408</td>\n",
       "      <td>0.497438</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>62.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>254.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>255.000000</td>\n",
       "      <td>255.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>254.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>255.000000</td>\n",
       "      <td>255.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>255.000000</td>\n",
       "      <td>38.000000</td>\n",
       "      <td>59.000000</td>\n",
       "      <td>255.000000</td>\n",
       "      <td>255.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               sttl  ct_dst_sport_ltm  ct_src_dport_ltm          swin  \\\n",
       "count  82328.000000      82328.000000      82328.000000  82328.000000   \n",
       "mean     180.973448          3.663092          4.929040    133.453175   \n",
       "std      101.512436          5.915518          8.389724    127.357276   \n",
       "min        0.000000          1.000000          1.000000      0.000000   \n",
       "25%       62.000000          1.000000          1.000000      0.000000   \n",
       "50%      254.000000          1.000000          1.000000    255.000000   \n",
       "75%      254.000000          3.000000          4.000000    255.000000   \n",
       "max      255.000000         38.000000         59.000000    255.000000   \n",
       "\n",
       "               dwin         label  \n",
       "count  82328.000000  82328.000000  \n",
       "mean     128.280464      0.550578  \n",
       "std      127.491408      0.497438  \n",
       "min        0.000000      0.000000  \n",
       "25%        0.000000      0.000000  \n",
       "50%      255.000000      1.000000  \n",
       "75%      255.000000      1.000000  \n",
       "max      255.000000      1.000000  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Load UNSW_NB15 into a Pandas dataframe\n",
    "df = pd.read_csv('UNSW_NB15_training_set.csv')\n",
    "\n",
    "# Remove the four duplicate rows with invalid value for is_ftp_login\n",
    "df = df[df.is_ftp_login != 2]\n",
    "\n",
    "# original df_five from minilab that were selected based off results from correlation matrix as most important features.\n",
    "df_five = df[['sttl','ct_dst_sport_ltm', 'ct_src_dport_ltm', 'swin', 'dwin', 'label' ]] # \n",
    "df_five.info()\n",
    "df_five.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sklearn.cross_validation.StratifiedKFold(labels=[0 0 0 ..., 0 0 0], n_folds=10, shuffle=False, random_state=None)\n"
     ]
    }
   ],
   "source": [
    "# we want to predict the X and y data as follows for 5 feature iteration: \n",
    "if 'label' in df_five:\n",
    "    y = df_five['label'].values # get the labels we want\n",
    "    del df_five['label'] # get rid of the class label\n",
    "    X = df_five.values # use everything else to predict!\n",
    "\n",
    "    # X and y are now numpy matrices, by calling 'values' on the pandas data frames we\n",
    "    # have converted them into simple matrices to use with scikit learn\n",
    "    \n",
    "    \n",
    "# to use the cross validation object in scikit learn, we need to grab an instance\n",
    "# of the object and set it up. This object will be able to split our data into \n",
    "# training and testing splits\n",
    "num_folds = 10\n",
    "cv_object = StratifiedKFold(y, num_folds)\n",
    "                         \n",
    "print cv_object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.87210009,  0.8908053 ,  0.8516944 ,  0.99186202,  0.93975465,\n",
       "        0.54706668,  0.65188874,  0.60974129,  0.64006317,  0.63070943])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html\n",
    "#was having issue loading the data as exmaple specifies with .data/.target,\n",
    "#instead tried to load data like Peter had previously done, by assigning values and then eliminating the 'label' category.\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from itertools import cycle\n",
    "\n",
    "from sklearn import svm, datasets\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import label_binarize\n",
    "from sklearn.multiclass import OneVsRestClassifier\n",
    "### from scipy import interp\n",
    "\n",
    "# Data to play with\n",
    "if 'label' in df_five:\n",
    "    y = df_five['label'].values # get the labels we want\n",
    "    del df_five['label'] # get rid of the class label\n",
    "    X = df_five.values # use everything else to predict!\n",
    "\n",
    "# Binarize the output\n",
    "### y = label_binarize(y, classes=[0, 1, 2])\n",
    "### n_classes = y.shape[1]\n",
    "\n",
    "# Add noisy features to make the problem harder\n",
    "### random_state = np.random.RandomState(0)\n",
    "### n_samples, n_features = X.shape\n",
    "### X = np.c_[X, random_state.randn(n_samples, 20 * n_features)]\n",
    "\n",
    "# shuffle and split training and test sets\n",
    "### X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,\n",
    "###                                                     random_state=0)\n",
    "\n",
    "# Learn to predict each class against the other\n",
    "### classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True))\n",
    "\n",
    "lr_clf = LogisticRegression(penalty='l2', C=1.0, class_weight=None)\n",
    "for train_indices, test_indices in cv_object:\n",
    "    X_train = X[train_indices]\n",
    "    y_train = y[train_indices]\n",
    "   \n",
    "    X_test = X[test_indices]\n",
    "    y_test = y[test_indices]\n",
    "    \n",
    "    lr_clf.fit(X_train,y_train)  # train object\n",
    "    y_hat = lr_clf.predict(X_test)\n",
    "    \n",
    "    # train the reusable logisitc regression model on the training data\n",
    "###    y_score = classifier.fit(X_train, y_train).decision_function(X_test)\n",
    "\n",
    "accuracies = cross_val_score(lr_clf, X, y=y, cv=cv_object) # this also can help with parallelism\n",
    "accuracies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Compute ROC curve and ROC area for each class\n",
    "### fpr = dict()\n",
    "### tpr = dict()\n",
    "### roc_auc = dict()\n",
    "### for i in range(len(y)):\n",
    "###     fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])\n",
    "fpr, tpr, _ = roc_curve(y_test, y_hat)\n",
    "\n",
    "### roc_auc[i] = auc(fpr[i], tpr[i])\n",
    "roc_auc = auc(fpr, tpr)\n",
    "\n",
    "# Compute micro-average ROC curve and ROC area\n",
    "### fpr[\"micro\"], tpr[\"micro\"], _ = roc_curve(y_test.ravel(), y_score.ravel())\n",
    "### roc_auc[\"micro\"] = auc(fpr[\"micro\"], tpr[\"micro\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbbf19e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "lw = 2\n",
    "plt.plot(fpr, tpr, color='darkorange',\n",
    "         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)\n",
    "plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('ROC Curve')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data Preparation:\n",
    "\n",
    "* Define and prepare your class variables. Use proper variable representations (int, float, one-hot, etc.). Use pre-processing methods (as needed) for dimensionality reduction, scaling, etc. Remove variables that are not needed/useful for the analysis."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Peter\n",
    "# df_five and df_seven based of describe does not require one-hot encoding and is ready for modeling\n",
    "# First lets redo accuracy results for logistic regression on original 5 features selected based on correlation matrix from\n",
    "# from lab 1 for accuracy comparision with additional 2 features suggested by grader using logistic regression model\n",
    "# with 80/20 shuffle split cross validation to determine if we should proceed with original 5 or add additional two features for\n",
    "# \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ShuffleSplit(82328, n_iter=3, test_size=0.2, random_state=None)\n"
     ]
    }
   ],
   "source": [
    "# we want to predict the X and y data as follows for 5 feature iteration: \n",
    "if 'label' in df_five:\n",
    "    y = df_five['label'].values # get the labels we want\n",
    "    del df_five['label'] # get rid of the class label\n",
    "    X = df_five.values # use everything else to predict!\n",
    "\n",
    "    # X and y are now numpy matrices, by calling 'values' on the pandas data frames we\n",
    "    # have converted them into simple matrices to use with scikit learn\n",
    "    \n",
    "    \n",
    "# to use the cross validation object in scikit learn, we need to grab an instance\n",
    "# of the object and set it up. This object will be able to split our data into \n",
    "# training and testing splits\n",
    "num_cv_iterations = 3\n",
    "num_instances = len(y)\n",
    "cv_object = ShuffleSplit(n=num_instances,\n",
    "                         n_iter=num_cv_iterations,\n",
    "                         test_size  = 0.2)\n",
    "                         \n",
    "print cv_object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.76867485  0.76758168  0.76673145]\n",
      "Average Accuracy (5 feature set) across 3 shuffle split cross validation iterations = 0.767662658407\n"
     ]
    }
   ],
   "source": [
    "# first we create a reusable logisitic regression object\n",
    "# here we can setup the object with different learning parameters and constants\n",
    "lr_clf = LogisticRegression(penalty='l2', C=1.0, class_weight=None) # get object\n",
    "for train_indices, test_indices in cv_object:\n",
    "    X_train = X[train_indices]\n",
    "    y_train = y[train_indices]\n",
    "    \n",
    "    X_test = X[test_indices]\n",
    "    y_test = y[test_indices]\n",
    "    \n",
    "    # train the reusable logisitc regression model on the training data\n",
    "    lr_clf.fit(X_train,y_train)  # train object\n",
    "    y_hat = lr_clf.predict(X_test)\n",
    "\n",
    "accuracies = cross_val_score(lr_clf, X, y=y, cv=cv_object) # this also can help with parallelism\n",
    "print(accuracies)\n",
    "print \"Average Accuracy (5 feature set) across \" + str(num_cv_iterations) + \" shuffle split cross validation iterations = \" + str(np.average(accuracies))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ShuffleSplit(82328, n_iter=3, test_size=0.2, random_state=None)\n"
     ]
    }
   ],
   "source": [
    "# we want to predict the X and y data as follows for 7 feature iteration: \n",
    "if 'label' in df_seven:\n",
    "    y = df_seven['label'].values # get the labels we want\n",
    "    del df_seven['label'] # get rid of the class label\n",
    "    X = df_seven.values # use everything else to predict!\n",
    "\n",
    "    # X and y are now numpy matrices, by calling 'values' on the pandas data frames we\n",
    "    # have converted them into simple matrices to use with scikit learn\n",
    "    \n",
    "    \n",
    "# to use the cross validation object in scikit learn, we need to grab an instance\n",
    "# of the object and set it up. This object will be able to split our data into \n",
    "# training and testing splits\n",
    "num_cv_iterations = 3\n",
    "num_instances = len(y)\n",
    "cv_object = ShuffleSplit(n=num_instances,\n",
    "                         n_iter=num_cv_iterations,\n",
    "                         test_size  = 0.2)\n",
    "                         \n",
    "print cv_object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.77280457  0.77043605  0.77620551]\n",
      "Average Accuracy (7 feature set) across 3 shuffle split cross validation iterations = 0.773148710474\n"
     ]
    }
   ],
   "source": [
    "# first we create a reusable logisitic regression object\n",
    "# here we can setup the object with different learning parameters and constants\n",
    "lr_clf = LogisticRegression(penalty='l2', C=1.0, class_weight=None) # get object\n",
    "for train_indices, test_indices in cv_object:\n",
    "    X_train = X[train_indices]\n",
    "    y_train = y[train_indices]\n",
    "    \n",
    "    X_test = X[test_indices]\n",
    "    y_test = y[test_indices]\n",
    "    \n",
    "    # train the reusable logisitc regression model on the training data\n",
    "    lr_clf.fit(X_train,y_train)  # train object\n",
    "    y_hat = lr_clf.predict(X_test)\n",
    "\n",
    "accuracies = cross_val_score(lr_clf, X, y=y, cv=cv_object) # this also can help with parallelism\n",
    "print(accuracies)\n",
    "print \"Average Accuracy (7 feature set) across \" + str(num_cv_iterations) + \" shuffle split cross validation iterations = \" + str(np.average(accuracies))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Based on the results there was negligible increase in accuracy with respect to including the additional 2 features\n",
    "requested by the grader in terms of explaining the data.  Hence we we stick with the original 5 based on correlation results\n",
    "from mini lab."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Describe the final dataset that is used for classification/regression (include a description of any newly formed variables you created)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Modeling and Evaluation:\n",
    "* Choose and explain your evaluation metrics that you will use (i.e., accuracy, precision, recall, F-measure, or any metric we have discussed). Why are the measure(s) appropriate for analyzing the results of your modeling? Give a detailed explanation backing up any assertions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Randy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*  Choose the method you will use for dividing your data into training and testing splits (i.e., are you using Stratified 10-fold cross validation? Why?). Explain why your chosen method is appropriate or use more than one method as appropriate. For example, if you are using time series data then you should be using continuous training and testing sets across time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Ravi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*  Create three different classification/regression models for each task (e.g., random forest, KNN, and SVM for task one and the same or different algorithms for task two). Two modeling techniques must be new (but the third could be SVM or logistic regression). Adjust parameters as appropriate to increase generalization performance using your chosen metric. You must investigate different parameters of the algorithms! "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*  Analyze the results using your chosen method of evaluation. Use visualizations of the results to bolster the analysis. Explain any visuals and analyze why they are interesting to someone that might use this model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Team"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Discuss the advantages of each model for each classification task, if any. If there are not advantages, explain why. Is any model better than another? Is the difference significant with 95% confidence? Use proper statistical comparison methods. You must use statistical comparison techniques—be sure they are appropriate for your chosen method of validation. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Team or TBD"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Which attributes from your analysis are most important? Use proper methods discussed in class to evaluate the importance of different attributes. Discuss the results and hypothesize about why certain attributes are more important than others for a given classification task."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Team or TBD"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Deployment:\n",
    "* How useful is your model for interested parties (i.e., the companies or organizations that might want to use it for prediction)? How would you measure the model's value if it was used by these parties? How would your deploy your model for interested parties? What other data should be collected? How often would the model need to be updated, etc.? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Daniel"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exceptional Work:\n",
    "\n",
    "You have free reign to provide additional analyses\n",
    "\n",
    "• One idea: grid search parameters in a parallelized fashion and visualize the\n",
    "performances across attributes. Which parameters are most significant for making a\n",
    "good model for each classification algorithm?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Randy and team"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
